package com.FOD.clases;

import rajawali.RajawaliActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
import android.view.View;
import android.view.View.OnTouchListener;

/**
 * Actividad que desplegara el cuerpo 3D para funcionalidad
 * @author rafa
 *
 */
public class ShowBody extends RajawaliActivity implements OnTouchListener {

	private BodyRenderer renderer; // Una clase del renderer (obligatoria)
	// Para detectar el gesto de zoom
	ScaleGestureDetector scaleGestureDetector;
	// variables para manteer control sobre la rotacion la camara
	float pointRot;
	float pointZoom;
	float pointCamMove;
	// variable para saber cuando se esta aplicando un zoom
	boolean onScale = false;;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		renderer = new BodyRenderer(this); // creamos un renderer
		// le asignamos un SyrfaceView
		renderer.setSurfaceView(mSurfaceView);
		// Asignamos el renderer a la clase padre
		super.setRenderer(renderer);
		
		// Le indicamos al surfaceView que escuchada cualquier touch
		mSurfaceView.setOnTouchListener(this);
		// Iniicializamos el detector de zoom
		scaleGestureDetector = new ScaleGestureDetector(this,
				new simpleOnScaleGestureListener());
	}

	// Cuando el usuario presiona una parte del surfaceView
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// Log.w("TOUCH", event.getX() + "-" + event.getY());
		// le decimos al detector de zoom que verifice el evento
		scaleGestureDetector.onTouchEvent(event);
		
		// verificamos que tipo de touch se hizo
		switch (event.getAction()) {
		/** Cuando solo se presiona hacia abajo **/
		case MotionEvent.ACTION_DOWN:
			// Verifica si se toco un objeto
			renderer.getObjectAt(event.getX(), event.getY());
			// inicializamos las variables de control
			pointRot = event.getX();
			pointCamMove = event.getX();
			/**Si la aplicacion no esta haciendo zoom prodecemos**/
			if (onScale != true) {
				// Si tocamos la parte superior de la pantalla esta se mover ahacia arriba
				if (event.getY() < 500 && event.getY() > 250) {
					// asignamos variable de control y movemos la camara
					pointCamMove = event.getX();
					renderer.moveCamY(-1f);
				} else if (event.getY() < 250 && event.getY() > 0) {
					// Si tocamos la parte central  la camara se mueve hacia abajo
					pointCamMove = event.getX();
					renderer.moveCamY(1f);
				}
			}
			break;
		/**Cuando el usuario continuamente muve el dedo por la pantalla**/
		case MotionEvent.ACTION_MOVE:
			/** SI la aplicacin no esta realizando zoom**/
			if (onScale != true) {
				// Si esta arrastrando el dedo hacia la derecha y estamos tocando al parte inferior rotamos hacia la derecha
				if (event.getX() > pointRot && event.getY() > 500) {
					pointRot = event.getX();
					renderer.rotObjY(-2);
				} else if (event.getY() > 500) {
					// si no rotamos hacia la izquierda
					pointRot = event.getX();
					renderer.rotObjY(2);
				}
			}
			break;
			/** Cuando levantamkos el dedo de la pantalla **/
		case MotionEvent.ACTION_UP:
			// Reiniciamos las variables de control
			pointRot = 0;
			pointZoom = 0;
			pointCamMove = 0;
			break;
		}
		return true;
	}

	/**
	 * Clase auxiliar para sobreescibir las funciones del detector de zoom
	 * @author rafa
	 *
	 */
	public class simpleOnScaleGestureListener extends
			SimpleOnScaleGestureListener {

		/**
		 * Cuando se esta haciendo una escala
		 */
		@Override
		public boolean onScale(ScaleGestureDetector detector) {
			// Aplicamos el zoom al rendere indicando la escala que se esta dando
			renderer.zoomObj(detector.getScaleFactor());
			// Log.w("TOUCH", ""+detector.getScaleFactor());
			return true;
		}
		/**
		 * Cuando se comienza una escala
		 */
		@Override
		public boolean onScaleBegin(ScaleGestureDetector detector) {
			// Indicamos a la variable de contorl que se esta relizando una escala
			onScale = true;
			return true;
		}
		
		/**
		 * Cuando se termina una escala
		 */
		@Override
		public void onScaleEnd(ScaleGestureDetector detector) {
			// Indicamos a la variable de contorl que la escla ha terminado
			onScale = false;
			
		}

	}
}
